package mx.itesm.pruebadmescenas;

import org.andengine.engine.Engine;

/**
 * Administra la escena que se está mostrando en la pantalla
 * 
 * @author Roberto Mtz. Román
 *
 */
public class ManejadorEscenas 
{
	// Diferentes escenas de la aplicación
	private EscenaBase escenaSplash;
	private EscenaBase escenaMenu;
	private EscenaBase escenaJuego;
	private EscenaBase escenaCargando;
	private EscenaBase escenaAcercaDe;

	private static final ManejadorEscenas INSTANCE = new ManejadorEscenas(); // Instancia única
																	
	// El tipo de escena que se está mostrando
	private TipoEscena tipoEscenaActual = TipoEscena.ESCENA_SPLASH; 
	// La escena que se está mostrando
	private EscenaBase escenaActual;
	// Referencia al engine
	private Engine engine = ManejadorRecursos.getInstance().engine;

	/**
	 * Pone en la pantalla la nueva escena y guarda el estado
	 * 
	 * @param escena referencia a la nueva escena
	 */
	private void setEscenaBase(EscenaBase escena) {
		engine.setScene(escena);
		escenaActual = escena;
		tipoEscenaActual = escena.getTipoEscena();
	}

	/**
	 * Cambia al tipo de escena nueva
	 * 
	 * @param tipoEscena el tipo de la nueva escena
	 */
	public void setEscena(TipoEscena tipoEscena) {
		switch (tipoEscena) {
		case ESCENA_SPLASH:
			setEscenaBase(escenaSplash);
			break;
		case ESCENA_MENU:
			setEscenaBase(escenaMenu);
			break;
		case ESCENA_JUEGO:
			setEscenaBase(escenaJuego);
			break;
		case ESCENA_CARGANDO:
			setEscenaBase(escenaCargando);
			break;
		case ESCENA_ACERCA_DE:
			setEscenaBase(escenaAcercaDe);
			break;
		}
	}

	/**
	 * Crea la instancia única de la case
	 * 
	 * @return la instancia creada
	 */
	public static ManejadorEscenas getInstance() {
		return INSTANCE;
	}

	/**
	 * Regresa el tipo de escena que se muestra actualmente
	 * 
	 * @return el tipo de escena actual
	 */
	public TipoEscena getTipoEscenaActual() {
		return tipoEscenaActual;
	}

	/**
	 * Regresa la escena que se está mostrando
	 * 
	 * @return la referencia la escena actual
	 */
	public EscenaBase getEscenaActual() {
		return escenaActual;
	}

	/**
	 * SPLASH
	 * Crea la escena Splash
	 */
	public void crearEscenaSplash() {
		ManejadorRecursos.getInstance().cargarRecursosSplash();	// Carga las imágenes necesarias
		escenaSplash = new EscenaSplash();	// Crea la escena
	}
	
	/**
	 * Libera los recursos de la escena Splash 
	 */
	public void liberarEscenaSplash() {
		ManejadorRecursos.getInstance().liberarRecursosSplash();	// Libera las imágenes
		escenaSplash.liberarEscena();	// Libera los elementos de la escena (sprites, menus, etc...)
		escenaSplash = null;
	}

	// ESCENA menu
	public void crearEscenaMenu() {
		ManejadorRecursos.getInstance().cargarRecursosMenu();
		ManejadorRecursos.getInstance().cargarRecursosBotones();
		escenaMenu = new EscenaMenu();
	}

	public void liberarEscenaMenu() {
		ManejadorRecursos.getInstance().liberarRecursosMenu();
		ManejadorRecursos.getInstance().liberarRecursosBotones();
		escenaMenu.liberarEscena();
		escenaMenu = null;
	}
	
	// ESCENA Juego
	public void crearEscenaJuego() {
		// Cargar recursos del juego (Personaje, Enemigo, Proyectil)
		ManejadorRecursos.getInstance().cargarRecursosJuego();
		escenaJuego = new EscenaJuego();
	}

	public void liberarEscenaJuego() {
		ManejadorRecursos.getInstance().liberarRecursosJuego();
		escenaJuego.liberarEscena();
		escenaJuego = null;
	}
	
	
	// ESCENA acerca de
	public void crearEscenaAcercaDe() {
		ManejadorRecursos.getInstance().cargarRecursosAcercaDe();
		escenaAcercaDe = new EscenaAcercaDe();
	}

	public void liberarEscenaAcercaDe() {
		ManejadorRecursos.getInstance().liberarRecursosAcercaDe();
		escenaAcercaDe.liberarEscena();
		escenaAcercaDe = null;
	}

}